package com.zjuee.web.login.controller;



import com.zjuee.base.bean.response.R;
import com.zjuee.base.constant.Common;
import com.zjuee.base.model.AuthUser;
import com.zjuee.gateway.utils.SecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 登录 web 接口
 *
 * @author wu liang
 * @since 2020/8/13 9:54
 */
@RestController
@RequestMapping(path = Common.Service.ZJUEE_LOGIN_URL_PREFIX, name = Common.Service.ZJUEE_LOGIN_SERVICE_NAME)
@Slf4j
public class LoginController {


    /**
     * 首次登录成功后，将直接在MyFormAuthenticationFilter拦截器中直接返回，不会进入此方法
     * 在登录完成后，重复发送登录请求会进入此方法
     * loginType -  0-不需要加密  1 - web用户密码登录 2- web手机验证码登录
     * 3 - app用户密码登录 4- app手机验证码登录
     * 5 - 电子秤用户密码登录
     */
    //登录，注意请求参数格式
    @PostMapping("/login")
    public R login(String username, String password, String loginType) {
        return R.ok(SecurityUtil.getOnlineUser(),"您已经成功登录，请不要重复登录");
    }

    /**
     * 获取当前登录用户详情
     */
    @GetMapping("/info")
    public R userInfo() {
        return R.ok(SecurityUtil.getOnlineUser());
    }

    /**
     * 手动执行退出操作
     */
    @PostMapping("/logout")
    public R logout() {
        Subject subject = SecurityUtils.getSubject();
        if (subject==null) {
            return R.ok();
        }
        AuthUser onlineUser = SecurityUtil.getOnlineUser();
        subject.logout();
        return R.ok("退出登录成功");
    }

    //04-获取图片验证码 type: null 普通验证码  slide 滑动验证码  clickWord 点选验证码
//    @PostMapping("/captcha/get")
//    public R getCaptcha(String type, HttpServletRequest request, HttpServletResponse response) {
//        // 滑动图片 或者 点选图片
//        if ("slide".equals(type) || "clickWord".equals(type)) {
//            CaptchaService instance = CaptchaServiceFactory.getInstance(type);
//            CaptchaBean captchaBean = instance.get(request);
//            captchaBean.setAuthHeaderKey(SecurityUtil.AUTHORIZATION);
//            String sessionId = request.getSession().getId();
//            captchaBean.setAuthValue(sessionId);
//
//            // 我们的session 默认为4个小时 而本接口又是无访问条件的 如果有大量访问且不带sessionId的情况，将会重复创建session
//            // 这里重设session的有效期为30分钟 目的是如果获取验证码后没有使用 让session尽快清除
//            RedisUtil.expire(MySessionDAO.PREFIX + sessionId, 3600);
//            return Result.success(captchaBean);
//        }
//
//        // 普通的输入文字 和 数字计算 随机返回
//        String capStr;
//        String result;
//        BufferedImage bi;
//        // Random random = new SecureRandom();
//        // int i = random.nextInt(2);
//        // if (i == 0) {
//        //     // 数字计算
//        //     DefaultKaptcha captchaProducerMath = CaptchaConfig.captchaProducer4Math();
//        //     String mathText = captchaProducerMath.createText();
//        //     capStr = mathText.substring(0, mathText.lastIndexOf("@"));
//        //     result = mathText.substring(mathText.lastIndexOf("@") + 1);
//        //     bi = captchaProducerMath.createImage(capStr);
//        //
//        //
//        // } else {
//            // 普通字符
//            // DefaultKaptcha captchaProducer = CaptchaConfig.captchaProducer4Str();
//            // capStr = captchaProducer.createText();
//            // result = capStr;
//            // bi = captchaProducer.createImage(capStr);
//
//            // 4位数字
//            ValidateCode vCode = new ValidateCode(100, 40, 4, 30);
//            result = vCode.getCode();
//            bi = vCode.getBuffImg();
//        // }
//
//        // 图片转dataUrl
//        String photoBase64 = CaptUtils.imageToDataUrl(bi);
//        CaptchaBean captchaBean = new CaptchaBean();
//        captchaBean.setImageBase64(photoBase64);
//        HttpSession session = request.getSession();
//        captchaBean.setAuthHeaderKey(SecurityUtil.AUTHORIZATION);
//        captchaBean.setAuthValue(session.getId());
//
//        CaptchaBean sessionBean = new CaptchaBean();
//        sessionBean.setDefaultValue(result);
//        sessionBean.setExpiresTimes(System.currentTimeMillis() + CaptUtils.SESSION_CAPT_EXPIRES_TIMES);
//        session.setAttribute(CaptUtils.CAPTCHA_SESSION_KEY, sessionBean);
//        // 重设session的有效期为30分钟
//        String shiroSessionId = MySessionDAO.PREFIX + session.getId();
//        RedisUtil.expire(shiroSessionId, 3600);
//        return Result.success(captchaBean);
//    }

//    @ApiOperation(value = "05-校验图片验证码 并下发token（仅针对滑动或点选验证码 需要此步骤 先校验一次）")
//    @ApiIgnore
//    @PostMapping("/captcha/check")
//    public Result checkCaptcha(@RequestBody CaptchaBean params, HttpServletRequest request, HttpServletResponse response) {
//        // 如果客户端连session的id都没有携带 直接返回错误即可
//        String header = request.getHeader(SecurityUtil.AUTHORIZATION);
//        if (StringUtils.isBlank(header))
//            return Result.build(CommonResultCode.CAPTCHA_CHECK_ERR);
//        // 滑动图片 或者 点选图片
//        if ("slide".equals(params.getType()) || "clickWord".equals(params.getType())) {
//            CaptchaService instance = CaptchaServiceFactory.getInstance(params.getType());
//            String captchaToken = instance.check(params, request);
//            RedisUtil.expire(MySessionDAO.PREFIX + header, 3600);
//            return Result.success(captchaToken);
//        }
//        RedisUtil.expire(MySessionDAO.PREFIX + header, 3600);
//        return Result.build(CommonResultCode.CAPTCHA_CHECK_ERR);
//    }

//    @ApiOperation(value = "06-获取RSA公钥")
//    @ApiIgnore
//    @PostMapping("/publicKey")
//    public Result publicKey() {
//        // 这里 我们曾尝试每次请求的时候都生成一对新的公私钥 私钥放入到session中，公钥下发 这会更安全，因为每个客户端拿到的都是不同的公钥
//        // 但是本接口理论上来讲 将是无访问限制的，如果有恶意攻击的话 无限请求此接口且不主动携带sessionId  服务端将会无限制的创建session
//        // 而我们的session有效期默认是4小时 这太久了 在请求过大的时候 将会直接拖垮整个系统
//        // 综合考虑之下 我们将使用全局默认的公私钥，公私钥在每次项目重启的时候都将重置
//        return Result.success(RSAUtil.getDefaultKey().getPublicKeyStr());
//    }

}
